﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autocentro.Entities;
using System.Data;
using System.Data.Objects;


namespace Autocentro.Respository
{
    public class ProformaRepository :MasterRepository, IProformaRepository
    {
        public List<PROFORMA> GetAllFromProforma()
        {
            var query = from c in context.Proforma
                        .Include("Vehiculo")
                        .Include("Vehiculo.Cliente")
                        .Include("Vehiculo.MARCA")
                        .Include("DetalleProforma")
                        .Include("DetalleProforma.ProductoTipoVehiculo")
                        .Include("DetalleProforma.ProductoTipoVehiculo.PRODUCTO")
                        .Include("DetalleProforma.ProductoTipoVehiculo.PRODUCTO.UNIDAD_MEDIDA")
                        select c;

            return query.ToList();
        }


        public List<PROFORMA> GetAllFromProformasByCriterio(string criterio)
        {
            var query = from p in context.Proforma
                        .Include("Vehiculo")
                        .Include("Vehiculo.Cliente")
                        .Include("Vehiculo.MARCA")
                        .Include("DetalleProforma")
                        .Include("DetalleProforma.ProductoTipoVehiculo")
                        .Include("DetalleProforma.ProductoTipoVehiculo.PRODUCTO")
                        .Include("DetalleProforma.ProductoTipoVehiculo.PRODUCTO.UNIDAD_MEDIDA")
                        select p;

            if (criterio!=null && criterio!=string.Empty && criterio!="")
            {
                query = query.Where(p => p.Vehiculo.Cliente.RazonSocial_Nombre.ToUpper().Contains(criterio.ToUpper())
                     || p.Vehiculo.Cliente.Ruc_DNI.Contains(criterio));

            }
            //ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.ToList();
        }

        public PROFORMA GetProformaById(int id)
        {
            var query = from p in context.Proforma
                        .Include("Vehiculo")
                        .Include("Vehiculo.Cliente")
                        .Include("Vehiculo.MARCA")
                        .Include("DetalleProforma")
                        .Include("DetalleProforma.ProductoTipoVehiculo")
                        .Include("DetalleProforma.ProductoTipoVehiculo.PRODUCTO")
                        .Include("DetalleProforma.ProductoTipoVehiculo.PRODUCTO.UNIDAD_MEDIDA")
                        where p.Id.Equals(id)
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();
        }

        public void AddProforma(PROFORMA proforma)
        {
            proforma.Vehiculo = null;
            foreach (var item in proforma.DetalleProforma)
            {
                //item.UnidadMedida = null;
                item.ProductoTipoVehiculo = null;
                
                //context.Entry(item.UnidadMedida).State = EntityState.Unchanged;
                //context.Entry(item.ProductoTipoVehiculo).State = EntityState.Unchanged;
                context.Entry(item).State = EntityState.Added;
            }

            //context.Entry(proforma.Vehiculo).State = EntityState.Unchanged;
            context.Proforma.Add(proforma);
            context.SaveChanges();
        }

        public void UpdateProforma(PROFORMA proforma)
        {
            var proformaDB = context.Proforma.Find(proforma.Id);
            proformaDB.Fecha = proforma.Fecha;
            proformaDB.Vehiculo = proforma.Vehiculo;
            proformaDB.IdVehiculo = proforma.IdVehiculo;
            proformaDB.Total = proforma.Total;
            proformaDB.Observacion = proforma.Observacion;

            foreach (var item in proforma.DetalleProforma)
            {
                item.ProductoTipoVehiculo = null;

                if (item.Item.Equals(0))
                {
                    item.IdProforma = proforma.Id;
                    item.ProductoTipoVehiculo = context.ProductoTipoVehiculo.Find(item.IdProductoTipoVehiculo);
                    //item.UnidadMedida = context.UnidadMedida.Find(item.IdUnidadMedida);
                    context.Entry(item).State = EntityState.Added;
                    proformaDB.DetalleProforma.Add(item);
                }
                else
                {
                    //item.UnidadMedida = null;

                    context.DetalleProforma.Attach(item);
                    context.Entry(item).State = EntityState.Modified;
                }
            }

            context.Entry(proforma.Vehiculo).State = EntityState.Unchanged;
            context.Entry(proforma).State = EntityState.Modified;
            context.SaveChanges();
        }

        public void RemoveProforma(int id)
        {
            var existe = context.Proforma.Find(id);
            if (existe!=null)
            {
                context.Proforma.Remove(existe);
                context.SaveChanges();
            }
        }


        public List<PROFORMA> GetFromProformasbyFechasAndVehiculo(DateTime? fec1, DateTime? fec2, string vehiculo)
        {
            #region IF

            if (vehiculo != null && vehiculo != string.Empty && vehiculo != "")  // FECHAS - CLIENTE 
            {
                var query = from h in context.Proforma.Include("VEHICULO")
                        .Include("VEHICULO.CLIENTE")
                        .Include("VEHICULO.MARCA")

                            select h;

                if (fec1 != null && fec2 != null)//fechas y cliente
                {
                    query = from h in query
                            where (h.Fecha >= fec1.Value && h.Fecha <= fec2.Value) &&
                                    (h.Vehiculo.Placa.ToUpper().Contains(vehiculo.ToUpper()) ||
                                    h.Vehiculo.Marca.Descripcion.ToUpper().Contains(vehiculo.ToUpper()) ||
                                    h.Vehiculo.Cliente.RazonSocial_Nombre.ToUpper().Contains(vehiculo.ToUpper()))
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                if (fec1 != null && fec2 == null)//dia y cliente 
                {
                    query = from h in query
                            where
                            (h.Vehiculo.Placa.ToUpper().Contains(vehiculo.ToUpper()) ||
                            h.Vehiculo.Marca.Descripcion.ToUpper().Contains(vehiculo.ToUpper()) ||
                            h.Vehiculo.Cliente.RazonSocial_Nombre.ToUpper().Contains(vehiculo.ToUpper())) && h.Fecha == fec1.Value
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                if (fec1 == null && fec2 == null)//solo cliente
                {
                    query = from h in query
                            where h.Vehiculo.Cliente.RazonSocial_Nombre.ToUpper().Contains(vehiculo.ToUpper()) ||
                            h.Vehiculo.Marca.Descripcion.ToUpper().Contains(vehiculo.ToUpper()) ||
                            h.Vehiculo.Placa.ToUpper().Contains(vehiculo.ToUpper())
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                else //retornar todos
                {
                    query = from h in query
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                return query.Take(500).ToList();
            }

            #endregion

            #region ELSE

            else //sin cliente
            {
                var query = from h in context.Proforma.Include("VEHICULO")
                                                        .Include("VEHICULO.CLIENTE")
                                                        .Include("VEHICULO.MARCA")
                            select h;

                if (fec1 != null && fec2 != null)//rango de fechas
                {
                    query = from h in query
                            where h.Fecha >= fec1.Value && h.Fecha <= fec2.Value
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                if (fec1 != null && fec2 == null)//solo dia
                {
                    query = from h in query
                            where
                            h.Fecha == fec1.Value
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                if (fec1 == null && fec2 == null)//solo cliente
                {
                    query = from h in query
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                return query.Take(500).ToList();
            }
            #endregion
        }

       
    }
}




/*
 ALTER PROCEDURE [dbo].[GetProformaByPlaca]
@Placa varchar(10),
@IdProforma int
AS
declare 
@Item int
BEGIN
SELECT     C.Ruc_DNI, C.RazonSocialNombre, C.Direccion, 
		   P.Id IdProf,P.Fecha, P.Total, 
		   --DetP.Item, 
		   ROW_NUMBER() OVER(ORDER BY DetP.Item DESC) AS Item,
		   DetP.Cantidad, DetP.PrecioServicioUnit,(DetP.Cantidad * DetP.PrecioServicioUnit) TotalItem,
		   UM.Abreviatura,M.Descripcion AS DesMarca, PRO.Descripcion AS DesProd, V.Chasis, V.Kilometraje, V.Placa,
		   V.ModeloVehiculo as Modelo

FROM PRODUCTO PRO INNER JOIN DETALLEPROFORMA DetP ON PRO.Id = DetP.IdProducto
INNER JOIN PROFORMA P ON DetP.IdProforma = P.Id
INNER JOIN UNIDAD_MEDIDA UM ON DetP.IdUnidadMedida = UM.Id
INNER JOIN VEHICULO V ON P.IdVehiculo = V.Id
INNER JOIN CLIENTE C ON V.IdCliente = C.Id
INNER JOIN MARCA M ON M.Id = V.IdMarca
WHERE  V.Placa = @Placa  and P.Id = @IdProforma

END


 */